home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / dev / lang / Python151.lha / Python-1.5 / Lib / Python1.5 / py_compile.py < prev    next >
Text File  |  1998-03-26  |  2KB  |  69 lines

  1. """Routine to "compile" a .py file to a .pyc (or .pyo) file.
  2.  
  3. This module has intimate knowledge of the format of .pyc files.
  4. """
  5.  
  6. import imp
  7. MAGIC = imp.get_magic()
  8.  
  9. def wr_long(f, x):
  10.     "Internal; write a 32-bit int to a file in little-endian order."
  11.     f.write(chr( x        & 0xff))
  12.     f.write(chr((x >> 8)  & 0xff))
  13.     f.write(chr((x >> 16) & 0xff))
  14.     f.write(chr((x >> 24) & 0xff))
  15.  
  16. def compile(file, cfile=None, dfile=None):
  17.     """Byte-compile one Python source file to Python bytecode.
  18.  
  19.     Arguments:
  20.  
  21.     file:  source filename
  22.     cfile: target filename; defaults to source with 'c' or 'o' appended
  23.            ('c' normally, 'o' in optimizing mode, giving .pyc or .pyo)
  24.     dfile: purported filename; defaults to source (this is the filename
  25.            that will show up in error messages)
  26.  
  27.     Note that it isn't necessary to byte-compile Python modules for
  28.     execution efficiency -- Python itself byte-compiles a module when
  29.     it is loaded, and if it can, writes out the bytecode to the
  30.     corresponding .pyc (or .pyo) file.
  31.  
  32.     However, if a Python installation is shared between users, it is a
  33.     good idea to byte-compile all modules upon installation, since
  34.     other users may not be able to write in the source directories,
  35.     and thus they won't be able to write the .pyc/.pyo file, and then
  36.     they would be byte-compiling every module each time it is loaded.
  37.     This can slow down program start-up considerably.
  38.  
  39.     See compileall.py for a script/module that uses this module to
  40.     byte-compile all installed files (or all files in selected
  41.     directories).
  42.  
  43.     """
  44.     import os, marshal, __builtin__
  45.     f = open(file)
  46.     try:
  47.         timestamp = os.fstat(file.fileno())
  48.     except AttributeError:
  49.         timestamp = long(os.stat(file)[8])
  50.     codestring = f.read()
  51.     f.close()
  52.     if codestring and codestring[-1] != '\n':
  53.         codestring = codestring + '\n'
  54.     codeobject = __builtin__.compile(codestring, dfile or file, 'exec')
  55.     if not cfile:
  56.         cfile = file + (__debug__ and 'c' or 'o')
  57.     fc = open(cfile, 'wb')
  58.     fc.write('\0\0\0\0')
  59.     wr_long(fc, timestamp)
  60.     marshal.dump(codeobject, fc)
  61.     fc.flush()
  62.     fc.seek(0, 0)
  63.     fc.write(MAGIC)
  64.     fc.close()
  65.     if os.name == 'mac':
  66.         import macfs
  67.         macfs.FSSpec(cfile).SetCreatorType('Pyth', 'PYC ')
  68.         macfs.FSSpec(file).SetCreatorType('Pyth', 'TEXT')
  69.